package com.leaves.common.util;

import cn.hutool.core.util.ObjectUtil;

/**
 * @Author: LEAVES
 * @Version 1.0
 * @Date: 2022年08月01日  11时03分44秒
 * @Description: 正则表达式
 */
public class RegexUtil {

    /**
     * 手机号
     */

    public static final String REGEX_PHONE = "^([1][3,4,5,6,7,8,9])\\d{9}$";

    /**
     * 2-20的不包含特殊符号
     */
    public static final String REGEX_CNC = "[A-Za-z0-9_\\-\\u4e00-\\u9fa5]{2,20}+";

    /**
     * 必须字母开头，允许4-16字节，允许字母数字下划线
     */
    public static final String REGEX_ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{3,15}$";

    /**
     * 由数字和字母组成，并且要同时含有数字和字母，且长度要在6-16位之间
     */
    public static final String REGEX_PWD = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$";

    /**
     * 密码长度8-20位且至少包含大写字母、小写字母、数字和特殊符号中的四种
     */
    public static final String REGEX_PWD1 = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,20}$";

    /**
     * 密码长度8-20位且至少包含大写字母、小写字母、数字或特殊符号中的任意三种
     */
    public static final String REGEX_PWD2 = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,20}$";

    /**
     * 必须包含大小写字母和数字的组合，可以使用特殊字符，长度在8-10之间
     */
    public static final String REGEX_PWD3 = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$";

    /**
     * 邮箱校验
     */
    public static final String REGEX_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";

    /**
     * 身份证校验
     */
    public static final String REGEX_ID_CARD = "^((\\d{18})|([0-9x]{18})|([0-9X]{18}))$";

    /**
     * 账号校验
     *
     * @param username
     * @return
     */
    public static boolean regexUsername(String username) {
        if (ObjectUtil.isNull(username))
            return false;
        return username.matches(REGEX_ACCOUNT);
    }

    /**
     * 组合校验账号
     *
     * @param username
     * @return
     */
    public static boolean regexCombinationUsername(String username) {
        if (ObjectUtil.isNull(username))
            return false;
        return username.matches(REGEX_ACCOUNT) || regexMobilePhone(username) || regexEmail(username);
    }

    /**
     * 手机号校验
     *
     * @param phone
     * @return
     */
    public static boolean regexMobilePhone(String phone) {
        if (ObjectUtil.isNull(phone))
            return false;
        return phone.matches(REGEX_PHONE);
    }

    /**
     * 邮箱校验
     *
     * @param email
     * @return
     */
    public static boolean regexEmail(String email) {
        if (ObjectUtil.isNull(email))
            return false;
        return email.matches(REGEX_EMAIL);
    }

    /**
     * 密码校验
     *
     * @param password
     * @return
     */
    public static boolean regexPassword(String password) {
        if (ObjectUtil.isNull(password))
            return false;
        return password.matches(REGEX_PWD3);
    }

    /**
     * 身份证校验
     *
     * @param idCard
     * @return
     */
    public static boolean regexIdCard(String idCard) {
        if (ObjectUtil.isNull(idCard)) ;
        return idCard.matches(REGEX_ID_CARD);
    }
}
